package com.imti.handlerdemo;

import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;

public class MainActivity extends AppCompatActivity
{

    private Handler mHandler;

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        initView();
    }

    private void initView()
    {
        Button btnSendMsgToMain = findViewById(R.id.btn_send_msg);
        Button btnToGif = findViewById(R.id.btn_to_gif);

        btnToGif.setOnClickListener(new OnClickListener()
        {
            @Override
            public void onClick(View v)
            {
                startActivity(new Intent(MainActivity.this, GifActivity.class));
            }
        });

        btnSendMsgToMain.setOnClickListener(new OnClickListener()
        {
            @Override
            public void onClick(View v)
            {
                //点击向主线程Handler发送消息
                sendMsgToMain();
            }
        });

        //创建主线程Handler
        //Handler构造方法中通过Looper的静态方法，传入谁的Looper
        //即是谁的Handler
        //Looper.getMainLooper() 获取主线程的Looper
        //Looper.myLooper() 获取当前线程的Looper，如果当前线程没有Looper
        //则为其创建新的Looper

        //故，Handler可以为主线程的Handler，也可以为子线程的Handler
        mHandler = new Handler(Looper.getMainLooper())
        {
            //消息处理方法
            @Override
            public void handleMessage(@NonNull Message msg)
            {
                super.handleMessage(msg);

                //通过Message.what字段，区分不同来源的消息
                switch (msg.what)
                {
                    case 0xf1:
                        String text = (String) msg.obj;

                        Toast.makeText(MainActivity.this,
                            "主线程收到：" + text,
                            Toast.LENGTH_SHORT)
                            .show();
                        break;
                }
            }
        };
    }

    private void sendMsgToMain()
    {
        new Thread()
        {
            @Override
            public void run()
            {
                super.run();

                for (int i = 0; i < 5; i++)
                {
                    //发送消息方法1
                    //创建消息
//                    Message msg = new Message();
//                    //消息标识，用于区分是哪个子线程发送的消息
//                    msg.what = 0xf1;
//                    //附带数据
//                    msg.obj = "来自子线程的消息" + i;
//
//                    //立即发送消息
//                    mHandler.sendMessage(msg);

                    //发送消息方法2(推荐)
                    //获取MessageQueue中闲置的消息（处理后还未被回收的Message对象）
                    Message msg2 = mHandler.obtainMessage();
                    msg2.what = 0xf1;
                    msg2.obj = "来自子线程的消息" + i;

                    //发送消息到此Message原有的MessageQueue中
                    msg2.sendToTarget();
                }
            }
        }.start();
    }
}